package ar.edu.utn.frsf.tpae.a2012.g05.entity;

import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.Table;

import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;

@Entity
@Table(name = "cta_cte")
@DiscriminatorValue("1")
public class CuentaCorriente extends Cuenta {
	@Column(name = "cta_cte_max_op_mens", nullable = false, unique = true)
	private Integer cantMaxOpMensuales;
	
	@Column(name = "cta_cte_cost_mant", nullable = false, unique = true)
	private Double costoMantenimiento;
	
	@Column(name = "cta_cte_lim_sdo_neg", nullable = false, unique = true)
	private Double limiteSaldoNegativo;
	
	@Column(name = "cta_cte_int_sdo_neg", nullable = false, unique = true)
	private Double interesSaldoNegativo;

	public CuentaCorriente() {
		super();
		this.setTipoCuenta(Cuenta.CUENTA_CORRIENTE);
	}

	public Integer getCantMaxOpMensuales() {
		return cantMaxOpMensuales;
	}

	public void setCantMaxOpMensuales(Integer cantMaxOpMensuales) {
		this.cantMaxOpMensuales = cantMaxOpMensuales;
	}

	public Double getCostoMantenimiento() {
		return costoMantenimiento;
	}

	public void setCostoMantenimiento(Double costoMantenimiento) {
		this.costoMantenimiento = costoMantenimiento;
	}

	public Double getLimiteSaldoNegativo() {
		return limiteSaldoNegativo;
	}

	public void setLimiteSaldoNegativo(Double limiteSaldoNegativo) {
		this.limiteSaldoNegativo = limiteSaldoNegativo;
	}

	public Double getInteresSaldoNegativo() {
		return interesSaldoNegativo;
	}

	public void setInteresSaldoNegativo(Double interesSaldoNegativo) {
		this.interesSaldoNegativo = interesSaldoNegativo;
	}
	
	@Override
	public void setTipoCuenta(Integer tipoCuenta) {
		super.setTipoCuenta(tipoCuenta);
		this.setDescripcionCuenta("Cuenta Corriente");
	}

	
	public boolean equals(Object obj) {
		return EqualsBuilder.reflectionEquals(this, obj);
	}

	public int hashCode() {
		return HashCodeBuilder.reflectionHashCode(this);
	}
	
	public int hashCode2() {
		final int prime = 31;
		int result = super.hashCode();
		result = prime
				* result
				+ ((cantMaxOpMensuales == null) ? 0 : cantMaxOpMensuales
						.hashCode());
		result = prime
				* result
				+ ((costoMantenimiento == null) ? 0 : costoMantenimiento
						.hashCode());
		result = prime
				* result
				+ ((interesSaldoNegativo == null) ? 0 : interesSaldoNegativo
						.hashCode());
		result = prime
				* result
				+ ((limiteSaldoNegativo == null) ? 0 : limiteSaldoNegativo
						.hashCode());
		return result;
	}

	public boolean equals2(Object obj) {
		if (this == obj)
			return true;
		if (!super.equals(obj))
			return false;
		if (getClass() != obj.getClass())
			return false;
		CuentaCorriente other = (CuentaCorriente) obj;
		if (cantMaxOpMensuales == null) {
			if (other.cantMaxOpMensuales != null)
				return false;
		} else if (!cantMaxOpMensuales.equals(other.cantMaxOpMensuales))
			return false;
		if (costoMantenimiento == null) {
			if (other.costoMantenimiento != null)
				return false;
		} else if (!costoMantenimiento.equals(other.costoMantenimiento))
			return false;
		if (interesSaldoNegativo == null) {
			if (other.interesSaldoNegativo != null)
				return false;
		} else if (!interesSaldoNegativo.equals(other.interesSaldoNegativo))
			return false;
		if (limiteSaldoNegativo == null) {
			if (other.limiteSaldoNegativo != null)
				return false;
		} else if (!limiteSaldoNegativo.equals(other.limiteSaldoNegativo))
			return false;
		return true;
	}

	@Override
	public String toString() {
		return "CuentaCorriente [cantMaxOpMensuales=" + cantMaxOpMensuales
				+ ", costoMantenimiento=" + costoMantenimiento
				+ ", limiteSaldoNegativo=" + limiteSaldoNegativo
				+ ", interesSaldoNegativo=" + interesSaldoNegativo + ", id="
				+ id + ", numero=" + numero
				+ ", fechaApertura=" + fechaApertura + ", saldoActual="
				+ saldoActual + ", tipoCuenta=" + tipoCuenta + "]";
	}

	@Override
	public boolean isCuentaCorriente() {
		return true;
	}

	@Override
	public boolean isCajaAhorro() {
		return false;
	}
	
	
}
